home *** CD-ROM | disk | FTP | other *** search
- /*
- * Blob Manager Demonstration: Fifteen-A-Row module
- *
- * 25 June 1986 Paul DuBois
- *
- * 30 Dec 93
- * - Converted blobs from picture blobs to procedure blobs.
- */
-
- # include "TransSkel.h"
-
- # include "BlobMgr.h"
- # include "BlobDemo.h"
-
-
- # define xMid 145
- # define yMid 100
- # define radius 10
-
-
- static WindowPtr wind;
- static BlobSetHandle donors;
- static BlobSetHandle receptors;
-
- static Boolean wait = false;
- static ControlHandle restartCtl;
-
-
- static void
- TestAnswer (void)
- {
- BlobHandle b, b2;
- short i;
-
- for (i = 0; i < 9; ++i)
- {
- b = GetBlobHandle (receptors, i);
- if ((**b).glob == nil) return;
- }
- b = GetBlobHandle (receptors, 0);
- if (GetBRefCon ((**b).glob) != 5L) return;
- for (i = 1; i < 5; i++)
- {
- b = GetBlobHandle (receptors, i);
- b2 = GetBlobHandle (receptors, i + 4);
- if (GetBRefCon ((**b).glob) + GetBRefCon ((**b2).glob) != 10L)
- return;
- }
- wait = true;
- FreezeBlobSet (receptors);
- HiliteControl (restartCtl, normalHilite);
- }
-
-
- static void
- DoLine (short x, short y)
- {
- MoveTo (xMid, yMid);
- LineTo (xMid + x, yMid + y);
- }
-
-
- static void
- DoLines (void)
- {
- DoLine (-50, 0);
- DoLine (-35, -35);
- DoLine (0, -50);
- DoLine (35, -35);
- DoLine (50, 0);
- DoLine (35, 35);
- DoLine (0, 50);
- DoLine (-35, 35);
- }
-
-
- /*
- * Draw donor or receptor blob. Both have empty static region, so partCode
- * is always inDragBlob.
- */
-
- static pascal void
- DrawDonor (BlobHandle bDst, BlobHandle bSrc, short partCode)
- {
- Rect r;
-
- r = BDragBox (bDst);
- EraseOval (&r);
- FrameOval (&r);
- MoveTo (r.left + 6, r.bottom - 6);
- DrawChar ((char) (GetBRefCon (bSrc) + '0'));
- }
-
- static pascal void
- DrawReceptor (BlobHandle bDst, BlobHandle bSrc, short partCode)
- {
- Rect r;
-
- r = BDragBox (bDst);
- PenSize (2, 2);
- EraseOval (&r);
- FrameOval (&r);
- PenSize (1, 1);
- }
-
-
- /*
- * Make donor and receptor blobs.
- *
- * Donor reference constant is the number to be drawn in the blob's static
- * region.
- */
-
- static void
- NewDonor (short val)
- {
- BlobHandle b;
- short diameter;
- Rect r;
-
- b = NewBlob (donors, true, 1, false, (long) val);
- diameter = radius + radius;
- SetRect (&r, 0, 0, diameter, diameter);
- OffsetRect (&r, (short) (val * (diameter + 6) + 5), 10);
- SetProcRectBlob (b, DrawDonor, &r, &r);
- }
-
-
- static void
- NewReceptor (short x, short y)
- {
- BlobHandle b;
- short diameter;
- Rect r;
-
- b = NewBlob (receptors, true, 1, false, 0L);
- diameter = radius + radius;
- SetRect (&r, 0, 0, diameter, diameter);
- OffsetRect (&r, xMid + x - radius, yMid + y - radius);
- SetProcRectBlob (b, DrawReceptor, &r, &r);
- }
-
-
- static pascal void
- Mouse (Point pt, long t, short mods)
- {
- ControlHandle ctl;
-
- if (FindControl (pt, wind, &ctl))
- {
- if (TrackControl (ctl, pt, nil))
- {
- HiliteControl (restartCtl, dimHilite);
- wait = false;
- ThawBlobSet (receptors);
- ZUnglueGlobSet (receptors);
- SkelPause (60L);
- InvalRect (&wind->portRect);
- ShuffleBlobSet (donors);
- ValidRect (&wind->portRect); /* avoid update event */
- }
- }
- else
- {
- BlobClick (pt, t, donors, receptors);
- TestAnswer ();
- }
- }
-
-
- static pascal void
- Update (Boolean resized)
- {
- DrawControls (wind);
- DoLines ();
- DrawBlobSet (receptors);
- DrawBlobSet (donors);
- }
-
-
- static pascal void
- Activate (Boolean active)
- {
- if (active)
- {
- SetDragRects (wind);
- SetBCPermissions (true, true, false, true, true);
- }
- }
-
-
- void
- FarInit (void)
- {
- short i;
- Rect r;
-
- SkelWindow (wind = GetDemoWind (farWindRes),
- Mouse, /* mouse clicks */
- nil, /* key clicks */
- Update, /* updates */
- Activate, /* activate/deactivate events */
- nil, /* close window */
- DoWClobber, /* dispose of window */
- nil, /* idle proc */
- false); /* irrelevant, since no idle proc */
-
- donors = NewBlobSet ();
- receptors = NewBlobSet ();
- NewReceptor (0, 0); /* middle point */
- NewReceptor (-50, 0);
- NewReceptor (-35, -35);
- NewReceptor (0, -50);
- NewReceptor (35, -35);
- NewReceptor (50, 0);
- NewReceptor (35, 35);
- NewReceptor (0, 50);
- NewReceptor (-35, 35);
- for (i = 0; i < 9; ++i)
- NewDonor (i+1);
- SetRect (&r, 20, 160, 100, 180);
- restartCtl = NewControl (wind, &r, "\pRestart", true, 0, 0, 0,
- pushButProc, 0L);
- HiliteControl (restartCtl, dimHilite);
-
- MakeFrontWind (wind);
- }
-